/*
 * @Author: OBKoro1
 * @Date: 2025-09-11 09:21:15
 * @LastEditTime: 2025-09-16 14:12:07
 * @FilePath: \RoPet_ESPS3_AI_EYE-main\main\iot\thing_manager.h
 * @Description: 
 * 
 * Copyright (c) 2025 by ${git_name_email}, All Rights Reserved. 
 */
//设备管理器（单例），负责注册、描述、状态管理和命令分发
#ifndef THING_MANAGER_H
#define THING_MANAGER_H


#include "thing.h"

#include <cJSON.h>

#include <vector>
#include <memory>
#include <functional>
#include <map>

namespace iot {

// 设备管理器类，采用单例模式设计
class ThingManager {
public:
    // 获取单例实例的静态方法
    // 使用局部静态变量实现线程安全的单例模式
    static ThingManager& GetInstance() {
        static ThingManager instance;
        return instance;
    }
    // 禁止拷贝构造函数，防止复制单例对象
    ThingManager(const ThingManager&) = delete;
    // 禁止赋值操作符，防止赋值单例对象
    ThingManager& operator=(const ThingManager&) = delete;

    // 添加设备到管理器中
    // 参数 thing: 指向设备对象的指针
    void AddThing(Thing* thing);

    // 获取所有设备的描述信息JSON字符串
    // 返回值: 包含所有设备描述信息的JSON字符串
    std::string GetDescriptorsJson();
    // 获取所有设备的状态信息JSON字符串，delta参数控制是否只返回变化的状态
    // 参数 json: 用于接收返回的JSON字符串
    // 参数 delta: 是否只返回变化的状态(true:只返回变化状态, false:返回全部状态)
    // 返回值: 操作是否成功
    bool GetStatesJson(std::string& json, bool delta = false);
    // 执行指定的命令
    // 参数 command: 指向命令JSON对象的指针
    void Invoke(const cJSON* command);

private:
    // 私有构造函数，确保只能通过GetInstance获取实例
    // 默认构造函数，不执行特殊初始化
    ThingManager() = default;
    // 私有析构函数
    // 默认析构函数，不执行特殊清理
    ~ThingManager() = default;

    // 存储所有已注册的设备指针的容器
    // 使用vector便于遍历所有设备
    std::vector<Thing*> things_;
    // 存储设备上一次状态的映射表，键为设备标识，值为状态JSON字符串
    // 用于比较状态变化，实现delta更新机制
    std::map<std::string, std::string> last_states_;
};


} // namespace iot

#endif // THING_MANAGER_H